/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.model.domain.usuario.opciones.OpcionPersonal;
import com.model.domain.usuario.opciones.OpcionProgramacionRutas;
import com.model.domain.usuario.Perfil;
import com.model.domain.usuario.PerfilEnum;
import com.model.domain.usuario.opciones.OpcionTransferenciaEnvio;
import com.model.domain.usuario.opciones.OpcionTransferenciaMonitoreo;
import com.model.domain.usuario.opciones.OpcionTransferenciaReporte;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import util.usuario.seguridad.Menu;
import util.usuario.seguridad.Opcion;
import util.usuario.seguridad.Opciones;

/**
 *
 * @author Rdelacruz
 */
public class PerfilService 
extends AbstractService
{
    
    private final Opciones opciones = new Opciones();
        
    public PerfilService() {
        
        opciones.agregar(OpcionPersonal.values());
        opciones.agregar(OpcionProgramacionRutas.values());        
        
        opciones.agregar(OpcionTransferenciaEnvio.values());        
        opciones.agregar(OpcionTransferenciaReporte.values());
        opciones.agregar(OpcionTransferenciaMonitoreo.values());        
        
        
       
    }
    
    public List<Perfil> findByCodigos(Connection con, String[] codigos) throws SQLException {
        List<Perfil> lista = findAll(con);
        if(codigos==null) {
            return lista;
        }
        else {
            List<Perfil> lista1 = new ArrayList<Perfil>();
            for(Perfil p:lista)  {
                for(String c : codigos) {
                    if(c.equals(p.getCodigo())) {
                        lista1.add(p);
                        break;
                    }
                }              
            }                
            return lista1;
        }
    }
    
    public List<Perfil> findAll(Connection con) throws SQLException {
        List<Perfil> lista = new ArrayList<Perfil>();
                
        Statement st = null;
        try {                        
            st = con.createStatement();
            String sql = "select * from Perfil";
            ResultSet rs = st.executeQuery(sql);
            while(rs.next()) {
                Perfil p = new Perfil();
                p.setCodigo(rs.getString("CodPerfil"));
                p.setNombre(rs.getString("nomPerfil"));                
                
                lista.add(p);
            }
        }
        finally {
            if(st!=null) st.close();
        }
        return lista;
    }
    
    public Perfil findConOpcionesByCodigo(Connection con, String codigo) throws SQLException {
        Perfil pf = findByCodigo(con,codigo);
        if(pf!=null) {
            setearOpciones(con, pf);
        }
        return pf;
    }
    
    private void setearOpciones(Connection con, Perfil p) throws SQLException {        
        //setearOpcionesEnDuro(p);
                        
        
        PerfilEnum e = p.getEnum();
        Menu<Opcion> ops = p.getOpciones();
        if(e==PerfilEnum.ADMINISTRADOR_SISTEMA) {
            //Se agregan todas las opciones, usando código fuentge
            for(Map.Entry<String,Opcion> entry : this.opciones.getOpciones()) {
                ops.agregar(entry.getValue());
            }
        }
        else {
            //Se agregan solo las opciones de la tabla perfil_opcion que este activas.
            //ADemas en la tabla Opcion tambien tiene que estar activa
            Statement st = null;
            try {                        
                st = con.createStatement();
                //String sql = "select * from perfil_opcion where cod_perfil='"+p.getCodigo()+"' and activo=1";
                
                String sql = 
"select PO.cod_opcion from perfil_opcion PO\n" +
"inner join Opcion OP\n" +
"	on PO.cod_opcion=OP.CodOpcion\n" +
"where cod_perfil='"+p.getCodigo()+"' and PO.activo=1 and OP.activo=1";
                
                ResultSet rs = st.executeQuery(sql);
                while(rs.next()) {                
                    String codOpcion = rs.getString("cod_opcion");
                    ops.agregar(this.opciones.getOpcion(codOpcion));
                }
            }
            finally {
                if(st!=null) st.close();
            }
        }
    }
    
    /*
    No se debe usar porque ahora se usa la tabla perfil_opcion de la base de datos
    */
    private void setearOpcionesEnDuro(Perfil p) throws SQLException {
        //EN CODIGO (EN DURO)
        PerfilEnum e = p.getEnum(); 
        Menu<Opcion> ops = p.getOpciones();
        
        //TEMPORAL: Ponerlo en BD
        switch(e) {
            case ADMINISTRADOR_CAMPO:
                ops.agregar(new OpcionTransferenciaEnvio[]{OpcionTransferenciaEnvio.SUBIR_XML_CAMPO});
                ops.agregar(OpcionTransferenciaReporte.values());
                ops.agregarExcepto(OpcionTransferenciaMonitoreo.values(), OpcionTransferenciaMonitoreo.RECUPERACION_ENVIOS);
                break;
            case ADMINISTRADOR_SISTEMA:                
                ops.agregar(OpcionTransferenciaEnvio.values());
                ops.agregar(OpcionTransferenciaReporte.values());
                ops.agregar(OpcionTransferenciaMonitoreo.values());                
                break;                    
            case OPERADOR_CAMPO:
                ops.agregar(new OpcionTransferenciaEnvio[] {OpcionTransferenciaEnvio.SUBIR_XML_CAMPO});
                ops.agregar(OpcionTransferenciaReporte.values());
                ops.agregarExcepto(OpcionTransferenciaMonitoreo.values(), OpcionTransferenciaMonitoreo.RECUPERACION_ENVIOS);                        
                break;
            case OPERADOR_SISTEMA:
                ops.agregar(new OpcionTransferenciaEnvio[] {OpcionTransferenciaEnvio.SUBIR_XML_MARCO, OpcionTransferenciaEnvio.INFORMACION_CARGA});
                ops.agregar(OpcionTransferenciaReporte.values());
                ops.agregar(OpcionTransferenciaMonitoreo.values());                        
                break;                        
            case USUARIO_NO_IDENTIFICADO:
                //p.getMenuEnvio().agregar(null);
                //p.getMenuReporte().agregar(null);
                //p.getMenuMonitoreo().agregar(null);                        
                break;
        }
    }
     
    

    public Perfil findByCodigo(Connection con, String codigo) throws SQLException {
        Statement st = null;
        try {                        
            st = con.createStatement();
            String sql = "select CodPerfil, nomPerfil from Perfil where CodPerfil='"+codigo+"'";
            ResultSet rs = st.executeQuery(sql);
            if(rs.next()) {
                Perfil p = new Perfil();
                p.setCodigo(rs.getString(1));
                p.setNombre(rs.getString(2)); 
                
                
                return p;
            }
        }
        finally {
            if(st!=null) st.close();
        }
        return null;
    }
    
    /*
    public Perfil findConPermisosByCodigo(Connection con, String codigo) throws SQLException {
        Perfil pf = findByCodigo(con,codigo);
        if(pf!=null) {
            setearOpciones(pf);
            setearPermisosPersonal(pf);
        }       
        return pf;        
    }
    */
    
}
